<!--
 * @Author: lmh
 * @Date: 2021-08-06 21:23:06
 * @LastEditTime: 2021-08-09 14:37:35
 * @LastEditors: lmh
 * @Description: vue-数据驱动2
-->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id="root">
        <p>{{ name }}</p>
        <p>{{ message }}</p>
        <div>
            <p>{{ name }}-{{ message }}</p>
        </div>
    </div>
</body>
</html>
<script>
    let rkuohao = /\{\{(.+?)\}\}/g; // 匹配花括号内部的东西
    function compiler(template, data) {
        for(let i = 0,len = template.childNodes.length; i < len; i++) {
            if (template.childNodes[i].nodeType == 3) {
                let txt = template.childNodes[i].nodeValue
                txt = txt.replace(rkuohao, function(_, g) {
                    return data[g.trim()];
                })
                template.childNodes[i].nodeValue = txt
            }else if (template.childNodes[i].nodeType == 1) {
                compiler(template.childNodes[i], data)
            }
        }
    }

    function JGVue(options) {
        // 习惯：内部使用下划线 开头，只读数据使用 $ 开头
        this._data = options.data
        this._el = options.el

        // 准备工作（准备模板）
        this.$el = this.templateDOM = document.querySelector(this._el)
        this._parent = this.templateDOM.parentNode

        // 渲染工作
        this.render()
    }
    // 提交 将模板和数据提交
    JGVue.prototype.render = function () {
        this.compiler()
    }
    // 编译 将模板与数据结合 得到 真正的DOM元素
    JGVue.prototype.compiler = function() {
        let realHTMLDom = this.templateDOM.cloneNode(true)
        compiler(realHTMLDom, this._data)
        this.update(realHTMLDom)
    }
    // 将DOM的元素 放到页面中
    JGVue.prototype.update = function(real) {
        this._parent.replaceChild(real, document.querySelector('#root'))
    }

    let app = new JGVue({
        el: '#root',
        data: {
            name: '张三',
            message: '是个法外狂徒啊'
        }
    })

</script>
